package classDemo;

import java.io.*;

/**
 * https://www.cnblogs.com/sfmjp/articles/2859546.html
 *
 * @author zyj-2018-5-31 15:45:50
 * @function 验证 Serializable serialVersionUID 已自测 2021-04-09 10:23:33
 * 结果：需要自己加上一个
 * private static final long serialVersionUID = -2337937881709830076L;
 * <p>
 * 防止修改字段后，旧数据序列化不成功。
 * <p>
 * <p>
 * /**
 * * java对象序列化必须有一个serialVersionUID,如果自己没有声明serialVersionUID,那么接口会默认生成一个serialversionUID
 * *
 * * 反序列化的时候会用这个serialVersionUID，对比字符序列的这个serialVersionUID和类中的serialVersionUID是否一样，
 * * 如果不一样就会报异常 java.io.InvalidClassException
 * * 已自测2021-04-09 10:16:27 eg: java.io.InvalidClassException: classReflectDemo.UserBean; local class incompatible: stream classdesc serialVersionUID = -5235180927295298254, local class serialVersionUID = -8277236173174876884
 * *
 * *
 * * 用户自定义serialVersionUID的好处
 * *
 * * 如果我们在反序列化之前把类中的内容做了修改，不如多加了一个属性，反序列化时就会报异常，因为类中的内容变了之后
 * *
 * * 默认生成的serialVersionUID和之前的不一样了。
 * *
 * *
 * * 如果是用户自定义的serialVersionUID，即使你改变了类中的内容，只有serialVersionUID不变，发序列化一样能成功。
 * * 原文链接：https://blog.csdn.net/fengqing5578/article/details/103120738
 */
public class Class_serialVersionUID_Test {
    private static String filePath = "./src/classReflectDemo/Class_serialVersionUID_Test.txt";

    public static void main(String[] args) {
        try {
            //write object to file
            writeObjectToFile();

            //get object from file
            getObjectFromFile();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void getObjectFromFile() throws IOException, ClassNotFoundException {
        FileInputStream fis = new FileInputStream(filePath);
        ObjectInputStream ois = new ObjectInputStream(fis);
        UserBean serial2 = (UserBean) ois.readObject();
        ois.close();
        System.out.println("get Object Deserial" + serial2.toString());
    }

    private static void writeObjectToFile() throws IOException {
        UserBean serial1 = new UserBean();
        serial1.age = 18;
        serial1.name = "紫霞XX";
        System.out.println("write Object Serial" + serial1.toString());
        FileOutputStream fos = new FileOutputStream(filePath);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(serial1);
        oos.flush();
        oos.close();
    }
}

class UserBean implements Serializable {
    private static final long serialVersionUID = -2337937881709830076L;
    public String name;
    public int age;
    public String addFieldTest = "default";

//    @Override
//    public String toString() {
//        return "UserBean [name=" + name + ", age=" + age + "]";
//    }


    @Override
    public String toString() {
        return "UserBean{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", addFieldTest='" + addFieldTest + '\'' +
                '}';
    }
}
